package p10_aop之agent代理;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ConfigurableApplicationContext;
import p09_aop之ajc代理.MyAjc;

/**
 * 第二中aop的实现方式，基于agent
 * 通过添加jvm参数，在类加载阶段动态增强class，不多bb
 */
public class MyAgent {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(MyAjc.class);
        Target target = context.getBean(Target.class);
        target.foo();
        context.close();
    }

    static class Target {
        public void foo() {
            System.out.println("这是目标类方法...");
        }
    }

    /**
     * 切面类，这个切面类尚未被spring管理
     */
    @Aspect
    static class MyAspect {
        @Before("execution(* Target.foo())")
        public void before() {
            System.out.println("前置通知...");
        }
    }
}
